package cn.tedu.oop;

/*本类用于面向对象2综合练习*/
public class TestTeacher {
    public static void main(String[] args) {
        //4.创建Teacher1类的对象
        Teacher1 t1 = new Teacher1();//触发的是无参构造
        Teacher1 t2=new Teacher1("涛涛",18,"微服务",100000.00);//触发的是全参构造
        /*被私有化的资源只能在本类中访问
        按照提供的公共的设置值SetXxx（）与访问值GetXxx（）的方式来使用属性
         */
        //4.1可以通过t1对象修改属性值
        t1.setName("泡泡");
        //4.2打印通过t1对象获取到的属性值
        System.out.println("t1.getName() = " + t1.getName());
        //4.3通过t1对象调用方法
        t1.ready();
        //t1.teach();
        //5.通过公共的设置值与访问之方法操作属性
        t1.setName("江江");//通过set方法设置值
        System.out.println("t1.getName() = " + t1.getName());//通过get方法获取值






        Teacher1 t3=new Teacher1("name",1,"地理",2);

    }
}

//1.抽象封装形成老师类，用于描述老师这一类事物--通过class关键字定义类
class Teacher1 {
    //2.1提供属性--成员变量
    //2.2堆属性进行封装--通过private关键字
    private String name;//姓名
    private int age;//年龄
    private String subject;//所授科目

    private double salary;//薪水
    //7.创建构造代码块
    /*类里方法外+创建对象时执行，优先于构造方法执行+提取构造方法的共性*/

    {
        System.out.print("我是一个构造代码块  ");
    }


    /*构造方法是与类同名。且没有返回值类型的用来创建对象的方法
    * 构造方法会在创建对象时触发，创建几个，触发几次
    * 默认存在无参构造，但若提供含参构造，默认的无参构造会被覆盖
    * 注意   手动添加无参构造
    * 我们提供了丰富的构造方法，是为了外界创建对象时足够灵活
    * */
    //6.1无参构造
    public Teacher1() {
        this("",18,"subj",10000.00);
        System.out.println("Constructor without parameter");
    }
    //6.2全参构造
    public Teacher1(String name, int age, String subject, double salary) {

        //this();

        this.name = name;
        this.age = age;
        this.subject = subject;
        this.salary = salary;
        System.out.println("Constructor with parameter");
    }
    //3.1提供功能--方法

    public void ready() {
        /*s方法里+调用此方法时触发+用于限制变量的使用范围*/
        {
            System.out.print("我是一个局部代码块");
            int i=100;
            System.out.println("i = " + i);
        }
        
        System.out.println("Preparing lessons...");
        /*我们可以在公共的方法中调用被封装方法的功能*/
        teach();
    }
    //3.2通过private修饰，封装讲课方法
    private  void teach() {
        System.out.println("Teaching...");
    }

    //2.3针对于被封装的属性提供get和set方法
    //右键空白出-Generate-Getter and Setter-Ctrl A全选 Enter确认
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}
